package modelo.Nivel;

import modelo.controlAereo.*;
import modelo.Orientacion.Posicion;
import modelo.Escenografia.*;
import java.util.ArrayList;
import titiritero.ObjetoVivo;
import vista.Visible;


public abstract class Nivel implements ObjetoVivo, Visible {

	private int cantidadAviones;
	private int tiempoEntreApariciones;
        protected int tiempo;
        protected AeroParque aeroparque;

	public Nivel(int cantidadAviones, int tiempoEntreApariciones){
		this.cantidadAviones = cantidadAviones;
		this.tiempoEntreApariciones = tiempoEntreApariciones;
                tiempo = 0; //Tiempo que pasa desde que se creo el nivel
	}

	
	private void actualizar() {
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: los aviones se mueven, chocan y aterrizan segun corresponda, al igual que se incrementa el tiempo*/
                tiempo++;
                this.controlarCreacionDeAeronaves();
		aeroparque.actualizar();
	}

	protected void controlarCreacionDeAeronaves(){
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: si es el tiempo de agregar una aeronave al escenario entonces agrega uno a la torre de control,
          en caso contrario no pasa nada*/
		//System.out.println("Tiempos:" + tiempoEntreApariciones + "," + tiempo);
              if ((tiempo%tiempoEntreApariciones) == 0 && (aeroparque.obtenerLasAeronaves().size() + aeroparque.devolverAeronavesChocadas().size() + aeroparque.devolverCantidadDeAvionesAterrizados() < cantidadAviones)){    // si el resto es 0
                aeroparque.agregarUnaNuevaAeronave();
                
            }
        }

	public boolean perdiste() {
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve true si algun avion choco, o sea el nivel se perdio, en caso contrario devuelve false*/
		return aeroparque.chocaronAeronaves();
	}

	public boolean ganaste() {
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve true si todos los aviones aterrizaron sin chocar, o sea que se gano el nivel,
          en caso contrario devuelve false*/
		if (this.cantidadAviones == aeroparque.devolverCantidadDeAvionesAterrizados()){
			return true;
		}else{
			return false;
		}
	}

	public void agregarTrayectoriaAAeronaveEnPosicion(Posicion unaPosicion, Posicion unaTrayectoria) {
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: si en la posicion pasa hay un avion y la posicion de la trayectoria esta dentor del escenario
          entonces le agrega una trayectoria, en caso contrario no pasa nada*/
		aeroparque.agregarTrayectoriaAAeronaveEnPosicion(unaPosicion, unaTrayectoria);
	}

        public ArrayList<Aeronave> obtenerLasAeronaves(){
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve las aeronaves que estan en el nivel*/
            return aeroparque.obtenerLasAeronaves();
        }

        public ArrayList<Pista> obtenerLasPistas(){
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve las pistas que estan en el nivel*/
            return aeroparque.obtenerLasPistas();
        }
        
        public Escenario devolverEscenario(){
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve el escenario del nivel*/
            return aeroparque.devolverEscenario();
        }
        
        public void vivir(){
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: se actualiza el nivel*/
            this.actualizar();
        }
        
    	public ArrayList<Aeronave> obtenerAeronavesNuevas() {
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve las aeronaves que se crearon nuevas*/
            return aeroparque.obtenerAeronavesNuevas();
    	}
    	
    	public void eliminarAeronavesNuevas() {
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: elimina las aeronaves nuevas*/
            aeroparque.eliminarAeronavesNuevas();
    	}
    	
    	public int devolverCantidadDeAvionesAterrizados(){
        /*PreCondicion: el nivel debe estar creado
          PostCondicion: devuelve la cantidad de aviones aterrizados*/
            return aeroparque.devolverCantidadDeAvionesAterrizados();
    	}

        public ArrayList<Aeronave> devolverAeronavesAterrizadas(){
        /*PreCondicion: la torre de control debe estar creada
          PostCondicion: devuelve una lista con las aeronaves chocadas*/
            return aeroparque.devolverAeronavesAterrizadas();
	}

        public void eliminarAeronavesAterrizadas(){
        /*PreCondicion: la torre de control debe estar creada
          PostCondicion: elimina las aeronaves chocadas de la torre*/
            aeroparque.eliminarAeronavesAterrizadas();
	}
}
